#include "drv_sys.h"
#include "main.h"  // 根据实际CMSIS版本调整

// 改用32位变量确保原子访问
static volatile uint32_t s_irq_lock_cnt = 0;

void drv_enter_critical(void)
{
    uint32_t primask = __get_PRIMASK();
    __disable_irq();
    
    // 内存屏障+安全检测
    __DSB();
    if(s_irq_lock_cnt >= DRV_CRITICAL_MAX_NESTING) {
        __BKPT(0);  // 触发断点防止栈溢出
    }
    s_irq_lock_cnt++;
    __ISB();
    
    // 保存原始PRIMASK状态（放在最后防止被优化）
    ((uint32_t*)&s_irq_lock_cnt)[1] = primask;
}

void drv_exit_critical(void)
{
    __DSB();
    if(s_irq_lock_cnt == 0) return;
    
    uint32_t primask = ((uint32_t*)&s_irq_lock_cnt)[1];
    s_irq_lock_cnt--;
    
    if(s_irq_lock_cnt == 0) {
        __ISB();
        __set_PRIMASK(primask);  // 恢复原始中断状态
    }
    __DSB();
}

uint32_t drv_get_critical_level(void)
{
    return s_irq_lock_cnt & 0xFF;  // 返回低8位
}
